﻿using GamFi.Admin.API.Application.Contracts.Chat.GetMessages;
using GamFi.Admin.API.Application.Interfaces;
using GamFi.Admin.API.Domain.Entities;
using MediatR;
using Microsoft.EntityFrameworkCore;
using MongoDB.Bson;
using MongoDB.Driver;

namespace GamFi.Admin.API.Application.Features.Queries.Chat.GetMessages;

public class GetMessagesQueryHandler(IDbContext dbContext, IMongoDatabase database)
    : IRequestHandler<GetMessagesQuery, GetMessagesResponse>
{
    public async Task<GetMessagesResponse> Handle(GetMessagesQuery request, CancellationToken cancellationToken)
    {
        var messagesCollection = database.GetCollection<Message>("Messages");

        // Создаем фильтр для запроса сообщений
        var filterBuilder = Builders<Message>.Filter;
        var filter = filterBuilder.Empty; // Изначально пустой фильтр

        // Пример добавления фильтрации по какому-то полю (например, TextMessage)
        if (!string.IsNullOrEmpty(request.Filter))
        {
            filter &= filterBuilder.Regex("TextMessage", new BsonRegularExpression(request.Filter, "i")); // "i" для регистронезависимого поиска
        }

        // Применяем фильтр к коллекции сообщений
        var messagesFromDb = await messagesCollection.Find(filter).ToListAsync(cancellationToken);

        // Остальная часть обработчика остается без изменений
        var users = await dbContext.Users.Include(u => u.UserInfo).ToListAsync(cancellationToken);
        var userDict = users.ToDictionary(u => u.UserInfo.Id);

        var oldMessages = messagesFromDb.Select(m => new MessageDto
        {
            Id = Guid.Parse(m.Id),
            TextMessage = m.TextMessage,
            CreatedBy =  Guid.Parse(m.CreatedBy),
            CreatedDate = DateTime.UtcNow,
            SenderName = userDict[Guid.Parse(m.CreatedBy)].UserName ?? "Unknown",
            SenderImageId = userDict[Guid.Parse(m.CreatedBy)].UserInfo.ImageId,
        }).ToList();

        return new GetMessagesResponse { Messages = oldMessages };
    }
}